<?php

namespace Agp\CoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Common\Collections\ArrayCollection;
use Agp\CoreBundle\Entity\TerminalEmpresaConfig;
use APY\DataGridBundle\Grid\Mapping as GRID;
use Agp\CoreBundle\Entity\Atendente;

/**
 * Agp\CoreBundle\Entity\TerminalEmpresa
 *
 * @ORM\Table(name="terminal_empresa")
 * @ORM\Entity(repositoryClass="Agp\CoreBundle\Repository\TerminalEmpresaRepository")
 * @ORM\HasLifecycleCallbacks
 * @GRID\Source(columns="codTerminalEmpresa, situacao, terminal.codTerminal, terminal.versaoSistema, empresa.razaoSocial, empresa.codEmpresa, liberacao, dtInicio, dtTermino")
 */
class TerminalEmpresa
{
    
    /**
     * @var integer $codTerminalEmpresa
     *
     * @ORM\Column(name="cod_terminal_empresa", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * 
     * @GRID\Column(title="Código", visible=false, type="text", size="5", primary=true)
     */
    protected $codTerminalEmpresa;
    
    /** 
     * @ORM\ManyToOne(targetEntity="Terminal", inversedBy="terminalReference")
     * @ORM\JoinColumn(name="cod_terminal", referencedColumnName="cod_terminal", onDelete="Cascade", nullable=false)
     * @Assert\NotBlank(groups={"terminal"})
     * 
     * @GRID\Column(field="terminal.versaoSistema", visible=true, title="Versão", type="text")
     * @GRID\Column(field="terminal.codTerminal", size="1", type="text", title="Terminal")
     * 
     */
    protected $terminal;

    /** 
     * @ORM\ManyToOne(targetEntity="Empresa", inversedBy="empresaReference")
     * @ORM\JoinColumn(name="cod_empresa", referencedColumnName="cod_empresa", onDelete="Cascade", nullable=false)
     * @Assert\NotBlank(groups={"empresa"})
     * 
     * @GRID\Column(field="empresa.codEmpresa", visible=false, type="text", title="Empresa")
     * @GRID\Column(field="empresa.razaoSocial", type="text", title="Empresa")
     * 
     */
    protected $empresa;

    
    const SIT_ATIVO = 'Ativo';
    const SIT_INATIVO = 'Inativo';
    /**
     * @var string $situacao
     *
     * @ORM\Column(name="situacao", type="string", nullable=false)
     * @GRID\Column(title="Situação", type="text", size=8, align="center", filter="select", selectFrom="source")
     */
    protected $situacao;

    /**
     * @var string $liberacao
     *
     * @ORM\Column(name="liberacao", type="string", length=45, nullable=true)
     * @GRID\Column(title="Liberação", type="text", size="350", align="center")
     */
    protected $liberacao;
    
    const BLQ_NAO = 'Nao';
    const BLQ_TEMPORARIO = 'Temporario';
    const BLQ_PERMANENTE = "Permanente";
    
    /**
     * @var string $bloquear
     *
     * @ORM\Column(name="bloquear", type="string", nullable=true)
     */
    protected $bloquear;

    /**
     * @var \DateTime $dtLiberacao
     *
     * @ORM\Column(name="dt_liberacao", type="datetime", nullable=true)
     */
    protected $dtLiberacao;
    
    /**
     * @var \DateTime $dtInicio
     *
     * @ORM\Column(name="dt_inicio", type="date", nullable=true)
     * 
     * @GRID\Column(title="Início", size=8, type="date", size="5", align="center")
     */
    protected $dtInicio;

    /**
     * @var \DateTime $dtTermino
     *
     * @ORM\Column(name="dt_termino", type="date", nullable=true)
     * 
     * @GRID\Column(title="Término", size=8, type="date", align="center")
     */
    protected $dtTermino;
    
    /**
     * @var string $observacao
     *
     * @ORM\Column(name="observacao", type="text", nullable=true)
     */
    protected $observacao;
    
    /**
     * @ORM\ManyToOne(targetEntity="Agp\CoreBundle\Entity\Contrato", fetch="LAZY", cascade={"persist"}, inversedBy="terminais")
     * @ORM\JoinColumn(name="cod_contrato", referencedColumnName="cod_contrato", onDelete="set null")
     * @var object
     */
    protected $contrato;

    /**
     * @ORM\ManyToMany(targetEntity="Pessoa", mappedBy="terminais")
     * @ORM\JoinTable(name="pessoa_terminal_empresa",
     *     joinColumns={@ORM\JoinColumn(name="cod_terminal_empresa", referencedColumnName="cod_terminal_empresa")},
     *     inverseJoinColumns={@ORM\JoinColumn(name="cod_pessoa", referencedColumnName="cod_pessoa")}
     * )
     * 
     * @var ArrayCollection $pessoas
     */ 
    protected $pessoas;

    /**
     *
     * @ORM\OneToMany(targetEntity="HabilitaProdutoTerminal", mappedBy="terminalEmpresa", cascade={"all"}, orphanRemoval=true)
     */
    protected $habilitaProdutoTerminalList;
    
    /**
     * @ORM\OneToMany(targetEntity="EventoTerminalEmpresa", mappedBy="terminalEmpresa", cascade={"all"})
     */ 
    protected $eventos;
    
    /**
     * @var object $atendente
     *
     * @ORM\ManyToOne(targetEntity="Atendente", fetch="LAZY")
     * @ORM\JoinColumn(name="cod_atendente", referencedColumnName="cod_atendente", onDelete="SET NULL", nullable=true)
     */
    protected $atendente;
    
    /**
     * @var object $layout
     *
     * @ORM\ManyToOne(targetEntity="Layout", fetch="LAZY")
     * @ORM\JoinColumn(name="cod_layout", referencedColumnName="cod_layout", onDelete="SET NULL", nullable=true)
     */
    protected $layout;
    
    /**
     * @var object $evento
     *
     * @ORM\ManyToOne(targetEntity="Evento", fetch="LAZY")
     * @ORM\JoinColumn(name="cod_evento", referencedColumnName="cod_evento", onDelete="SET NULL", nullable=true)
     */
    protected $evento;
    
    /**
     *
     * @ORM\Column(name="compartilhado", type="boolean", nullable=true)
     */
    protected $compartilhado;
    
    /** 
     * @ORM\ManyToOne(targetEntity="Chip")
     * @ORM\JoinColumn(name="cod_chip", referencedColumnName="cod_chip", onDelete="set null", nullable=true)
     * 
     */
    protected $chip;

    public function __construct() {
        $this->dtLiberacao = new \DateTime;
        $this->dtInicio = new \Datetime;
        $this->dtTermino = new \Datetime;
        $this->situacao = self::SIT_INATIVO;
        $this->habilitaProdutoTerminalList = new ArrayCollection;
        $this->eventos = new ArrayCollection();
        $this->compartilhado = false;
    }
    public function __toString() {
        return (string)$this->terminal->getCodTerminal();
    }
    
    public function clearInfos(){
        $this->habilitaProdutoTerminalList->clear();
    }
    
    public function hasEvento($evento){
        
        foreach ($this->eventos as $ete){
            if ($evento->getCodEvento() == $ete->getEvento()->getCodEvento()){
                return $ete;
            }
        }
        
        return false;
    }

    public function isAtivo(){
        if ($this->situacao == self::SIT_ATIVO){
            return true;
        }else{
            return false;
        }
    }
    
    public function hasPdv($evento){
       $ete = $this->getEventoTerminalEmpresa($evento);
       if ($ete != null AND $ete->getAtendente() != null){
           return true;
       }else{
           return false;
       }
    }
    
    public function hasAtendente(){
        return ($this->atendente != null AND $this->atendente->getTipo() == Atendente::TP_ATEN);
    }

    public function getAtendenteByTipo(){
       if ($this->hasAtendente())
           return $this->atendente;
       else
           null;
       
    }
    
    public function getEventoTerminalEmpresa($evento){
        foreach ($this->eventos as $e){
            if ($e->getEvento()->getCodEvento() == $evento->getCodEvento()){
                return $e;
            }
        }
        
        return false;
    }

    /**
     * @Assert\True(message = "Data de início maior que de término")
     */
    public function isDateLegal()
    {
        if ($this->dtInicio > $this->dtTermino){
            return false;
        }
        
    }
    
    /**
     * @Assert\True(message = "Terminal Compartilhado")
     */
    public function isCompartilhadoTerminal()
    {
        if ($this->getTerminal() != null){
            foreach ($this->getTerminal()->getTerminalReference() as $te){
                if ($te->getCompartilhado() == true){
                    return false;
                }
            }
        }
    }
  
    public function isIgual($terminalEmpresa){
        return ($this->codTerminalEmpresa == $terminalEmpresa->getCodTerminalEmpresa());
    }

    /* hack for Acls */
    public function getId(){
        return 'class';
    }

    /**
     * Get codTerminalEmpresa
     *
     * @return integer 
     */
    public function getCodTerminalEmpresa()
    {
        return $this->codTerminalEmpresa;
    }

    /**
     * Set terminal
     *
     * @param integer $terminal
     * @return TerminalEmpresa
     */
    public function setTerminal($terminal)
    {
        $this->terminal = $terminal;
    
        return $this;
    }

    /**
     * Get terminal
     *
     * @return integer 
     */
    public function getTerminal()
    {
        return $this->terminal;
    }

    /**
     * Set empresa
     *
     * @param integer $empresa
     * @return TerminalEmpresa
     */
    public function setEmpresa($empresa)
    {
        $this->empresa = $empresa;
    
        return $this;
    }

    /**
     * Get empresa
     *
     * @return integer 
     */
    public function getEmpresa()
    {
        return $this->empresa;
    }

    /**
     * Set situacao
     *
     * @param string $situacao
     * @return TerminalEmpresa
     */
    public function setSituacao($situacao)
    {
        $this->situacao = $situacao;
    
        return $this;
    }

    /**
     * Get situacao
     *
     * @return string 
     */
    public function getSituacao()
    {
        return $this->situacao;
    }

    /**
     * Set liberacao
     *
     * @param string $liberacao
     * @return TerminalEmpresa
     */
    public function setLiberacao($liberacao)
    {
        $this->liberacao = $liberacao;
    
        return $this;
    }

    /**
     * Get liberacao
     *
     * @return string // MESMA FUNCAO EM Utils.php E AdminExtension
     */
    public function getLiberacaoFormatado()
    {
        $versao = $this->terminal->getVersaoSistema();
        if ($versao[0] == 4){
            $string1 = substr_replace($this->liberacao," - ",7,0);
            $string2 = substr_replace($string1," - ",17,0);
            $string3 = substr_replace($string2," - ",27,0);
            return mb_strtoupper($string3, 'UTF-8');
        }elseif($versao[0] >= 5){
            $string1 = substr_replace($this->liberacao," - ",5,0);
            $string2 = substr_replace($string1," - ",13,0);
            $string3 = substr_replace($string2," - ",21,0);
            return mb_strtoupper($string3, 'UTF-8');
        }else{
            return mb_strtoupper($this->liberacao,'UTF-8');
        }
    }
    
    /**
     * Get liberacao
     *
     * @return string 
     */
    public function getLiberacao()
    {
        return $this->liberacao;
    }

    /**
     * Set bloquear
     *
     * @param string $bloquear
     * @return TerminalEmpresa
     */
    public function setBloquear($bloquear)
    {
        $this->bloquear = $bloquear;
    
        return $this;
    }

    /**
     * Get bloquear
     *
     * @return string 
     */
    public function getBloquear()
    {
        return $this->bloquear;
    }

    /**
     * Set dtLiberacao
     *
     * @param \DateTime $dtLiberacao
     * @return TerminalEmpresa
     */
    public function setDtLiberacao($dtLiberacao)
    {
        $this->dtLiberacao = $dtLiberacao;
    
        return $this;
    }

    /**
     * Get dtLiberacao
     *
     * @return \DateTime 
     */
    public function getDtLiberacao()
    {
        return $this->dtLiberacao;
    }
    
    /**
     * Set dtInicio
     *
     * @param \DateTime $dtInicio
     * @return Evento
     */
    public function setDtInicio($dtInicio)
    {
        $this->dtInicio = $dtInicio;
    
        return $this;
    }

    /**
     * Get dtInicio
     *
     * @return \DateTime 
     */
    public function getDtInicio()
    {
        return $this->dtInicio;
    }

    /**
     * Set dtTermino
     *
     * @param \DateTime $dtTermino
     * @return Evento
     */
    public function setDtTermino($dtTermino)
    {
        $this->dtTermino = $dtTermino;
    
        return $this;
    }

    /**
     * Get dtTermino
     *
     * @return \DateTime 
     */
    public function getDtTermino()
    {
        return $this->dtTermino;
    }

    static public function getSituacaoList()
    {
        return array(self::SIT_ATIVO => self::SIT_ATIVO,
                     self::SIT_INATIVO => self::SIT_INATIVO
                    );
    }
    
    static public function getBloqueioList()
    {
        return array(self::BLQ_NAO => self::BLQ_NAO,
                     self::BLQ_TEMPORARIO => self::BLQ_TEMPORARIO,
                     self::BLQ_PERMANENTE => self::BLQ_PERMANENTE,
                     );
    }
    
    static public function getTipoVinculoList()
    {
        return array(self::TIPO_TEMPORARIO => self::TIPO_TEMPORARIO,
                     self::TIPO_PERMANENTE => self::TIPO_PERMANENTE
                    );
    }
    
    /**
     * Add $habilitaProdutoTerminalList
     *
     * @param Agp\CoreBundle\Entity\HabilitaListaTerminal $habilitaProdutoTerminalList
     */
    public function addHabilitaProdutoTerminalList(\Agp\CoreBundle\Entity\HabilitaProdutoTerminal $habilitaProdutoTerminalList)
    {
        $this->habilitaProdutoTerminalList[] = $habilitaProdutoTerminalList;
    }

    /**
     * Get habilitaProdutoTerminalList
     *
     * @return Doctrine\Common\Collections\Collection 
     */
    public function getHabilitaProdutoTerminalList()
    {
        return $this->habilitaProdutoTerminalList;
    }
 
    public function getContrato() {
        return $this->contrato;
    }

    public function setContrato($contrato) {
        $this->contrato = $contrato;
    }
    
    public function getObservacao() {
        return $this->observacao;
    }

    public function setObservacao($observacao) {
        $this->observacao = $observacao;
    }
    
    public function addEvento($evento){
        $this->eventos[] = $evento;
    }

    public function getEventos() {
        return $this->eventos;
    }

    public function setEventos($eventos) {
        $this->eventos = $eventos;
    }
    
    public function getAtendente() {
        return $this->atendente;
    }

    public function setAtendente($atendente) {
        $this->atendente = $atendente;
    }
    
    public function getLayout() {
        return $this->layout;
    }

    public function setLayout($layout) {
        $this->layout = $layout;
    }
    
    public function getCompartilhado() {
        return $this->compartilhado;
    }

    public function setCompartilhado($compartilhado) {
        $this->compartilhado = $compartilhado;
    }
    
    public function getEvento() {
        return $this->evento;
    }

    public function setEvento($evento) {
        $this->evento = $evento;
    }
    
    public function getChip() {
        return $this->chip;
    }

    public function setChip($chip) {
        $this->chip = $chip;
        return $this;
    }
 
}